package com.weipt.juc;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author peter.wei 2020/09/15 20:25
 * @version 1.0
 * @company 终生学习
 * @description <br>peter.wei 2020/09/15 20:25
 *
 * 线程加法计数器，比如集齐7龙珠，召唤神龙
 *
 * 允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用，
 * 这些线程必须偶尔等待彼此。 屏障被称为循环 ，因为它可以在等待的线程被释放之后重新使用。
 **/
public class TestCyclicBarrier {

    public static void main(String[] args) {

        // 召唤龙珠的线程
        //parties：屏障跳闸前必须调用 await()的线程数
        //barrierCommand：当屏障跳闸时执行的命令
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->System.out.println("神龙召唤ok"));
        for (int i = 1; i <=7 ; i++) {
            final int temp = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"已集齐"+temp+"号龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}